﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;

namespace GigaSite.Web.Classes
{
    /// <summary>
    /// Кеширующий класс настроек, предназначенный для быстрого доступа к настройкам без постоянных запросов к СУБД
    /// </summary>
    public class SettingsCache
    {
        /// <summary>
        /// Кеширующий справочник
        /// </summary>
        private Dictionary<string, string> Cache { get; set; }

        /// <summary>
        /// Создает новый класс для кеширования настроек
        /// </summary>
        public SettingsCache()
        {
            Cache = new Dictionary<string, string>();
            
            // Получаем все настройки из системы
            var allSettings = Locator.GetService<ISettingsRepository>().FindAll();
            foreach (var setting in allSettings)
            {
                Cache[setting.Name] = setting.Value;
            }
        }

        /// <summary>
        /// Получает значение настройки, приводя его к указанному типу, если значения настройки нет, то возвращается значение по умолчанию
        /// </summary>
        /// <typeparam name="T">Тип настройки</typeparam>
        /// <param name="name">Имя настройки</param>
        /// <param name="defaultValue">Значение по умолчанию</param>
        /// <returns>Приведенное значение настройки</returns>
        public T GetValue<T>(string name, T defaultValue) where T: IConvertible
        {
            string value;
            if (!Cache.TryGetValue(name,out value))
            {
                return defaultValue;
            }
            var converter = TypeDescriptor.GetConverter(typeof(T));
            return (T)converter.ConvertFrom(value);
        }

        /// <summary>
        /// Устанавливает значение настройки
        /// </summary>
        /// <typeparam name="T">Тип настройки который установить</typeparam>
        /// <param name="name">Имя настройки</param>
        /// <param name="value">Значение</param>
        public void SetValue<T>(string name, T value)
        {
            Cache[name] = value.ToString();
            
            // Устанавливаем значение в СУБД
            Locator.GetService<ISettingsRepository>().SetValue(name,value.ToString());
        }
    }
}